package dbtools

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
	"modeltools/conf"
	"sync"
)

/*
* MysqlConnectiPool
* 数据库连接操作库
* 基于gorm封装开发
 */
type MysqlConnectPool struct {
}

var mysqlInstance *MysqlConnectPool
var mysqlOnce sync.Once

var db *gorm.DB
var err_db error

func GetMysqlInstance() *MysqlConnectPool {
	mysqlOnce.Do(func() {
		mysqlInstance = &MysqlConnectPool{}
	})
	return mysqlInstance
}

/*
* @fuc 初始化数据库连接(可在mail()适当位置调用)
 */
func (m *MysqlConnectPool) InitMysqlPool() (issucc bool) {
	dbConf := conf.MasterDbConfig
	dns2 := dbConf.User + ":" + dbConf.Pwd + "@tcp(" + dbConf.Host + ":" + dbConf.Port + ")/" + dbConf.DbName + "?charset=utf8&parseTime=True&loc=Local"
	fmt.Println("数据库连接地址：", dns2)
	mysqlConfig := mysql.Config{
		DriverName:                "mysql",
		DSN:                       dns2,  // DSN data source name
		DefaultStringSize:         255,   // string 类型字段的默认长度
		DisableDatetimePrecision:  true,  // 禁用 datetime 精度，MySQL 5.6 之前的数据库不支持
		DontSupportRenameIndex:    true,  // 重命名索引时采用删除并新建的方式，MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
		DontSupportRenameColumn:   true,  // 用 `change` 重命名列，MySQL 8 之前的数据库和 MariaDB 不支持重命名列
		SkipInitializeWithVersion: false, // 根据版本自动配置
	}

	dbs, err := gorm.Open(mysql.New(mysqlConfig), gormConfig(1))
	if err != nil {
		fmt.Println("数据库连接失败: " + err.Error())
		return false
	}

	dbss, errs := dbs.DB()
	if errs != nil {
		fmt.Println("获取dbs实例失败: " + errs.Error())
		return false
	}
	//设置空闲连接池中的最大连接数。
	maxIdleConns := 10
	//设置与数据库的最大打开连接数
	maxOpenConns := 10
	dbss.SetMaxIdleConns(maxIdleConns)
	dbss.SetMaxOpenConns(maxOpenConns)
	db = dbs

	return true
}

// gormConfig 根据配置决定是否开启日志
func gormConfig(mod int) *gorm.Config {
	switch mod {
	case 1:
		return &gorm.Config{
			Logger:                                   logger.Default.LogMode(logger.Info),
			DisableForeignKeyConstraintWhenMigrating: true,
			SkipDefaultTransaction:                   true, // 禁用默认事务
			//配置表面后面不要带s
			NamingStrategy: schema.NamingStrategy{
				TablePrefix:   "",
				SingularTable: true,
				NameReplacer:  nil,
			},
		}

	case 2:
		return &gorm.Config{
			Logger:                                   logger.Default.LogMode(logger.Silent),
			DisableForeignKeyConstraintWhenMigrating: true,
			SkipDefaultTransaction:                   true, // 禁用默认事务
			//配置表面后面不要带s
			NamingStrategy: schema.NamingStrategy{
				TablePrefix:   "",
				SingularTable: true,
				NameReplacer:  nil,
			},
		}

	}
	return nil
}

/*
* @fuc  对外获取数据库连接对象db
 */
func (m *MysqlConnectPool) GetMysqlPool() *gorm.DB {
	//db.LogMode(true)
	return db
}

func GetMysqlDb() (db *gorm.DB) {
	return GetMysqlInstance().GetMysqlPool()
}
